#include <Arduino.h>
#include "board_info.h"
#include <Wire.h>

#include <TFT_eSPI.h>
#include <lvgl.h>
#include <gui_guider.h>
#include <events_init.h>

lv_ui guider_ui;
BoardInfo board_info;

static long timer = 0;
static uint32_t total_sec = 0;
static float total_mA = 0.0;
static const uint16_t screenWidth = 240;
static const uint16_t screenHeight = 240;
static lv_disp_draw_buf_t draw_buf;
static lv_color_t buf[screenWidth * screenHeight / 10];
TFT_eSPI tft = TFT_eSPI(screenWidth, screenHeight); /* TFT instance */

/* Display flushing */
void my_disp_flush(lv_disp_drv_t* disp_drv,
                   const lv_area_t* area,
                   lv_color_t* color_p) {
  uint32_t w = (area->x2 - area->x1 + 1);
  uint32_t h = (area->y2 - area->y1 + 1);

  tft.startWrite();
  tft.setAddrWindow(area->x1, area->y1, w, h);
  tft.pushColors((uint16_t*)&color_p->full, w * h, true);
  tft.endWrite();

  lv_disp_flush_ready(disp_drv);
}

void setup() {
  Serial.begin(115200);

  Serial.printf(
      "\r\n********************** Init Board sensors  "
      "************************\r\n");
  board_info.Start();

  Serial.printf(
      "\r\n********************** Init TFT  "
      "************************\r\n");
  lv_init();

  tft.begin();        /* TFT init */
  tft.setRotation(3); /* Landscape orientation, flipped */
  lv_disp_draw_buf_init(&draw_buf, buf, NULL, screenWidth * screenHeight / 10);

  static lv_disp_drv_t disp_drv;
  lv_disp_drv_init(&disp_drv);
  disp_drv.hor_res = screenWidth;
  disp_drv.ver_res = screenHeight;
  disp_drv.flush_cb = my_disp_flush;
  disp_drv.draw_buf = &draw_buf;
  lv_disp_drv_register(&disp_drv);

  setup_ui(&guider_ui);
  events_init(&guider_ui);
}

void loop() {
  lv_timer_handler(); /* let the GUI do its work */

  board_info.UpdateMPU();
  if (millis() - timer > 1000) {
    Serial.println("=======================================================");
    BoadrInfoData mpu_data = board_info.Get();
    board_info.print(mpu_data);
    Serial.println("=======================================================\n");
    timer = millis();
  }
  delay(5);
}
